Fork me on GitHub

设计模式 - 模板

注意:所有文章除特别说明外,转载请注明出处.

简介

在该模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按照需要重写方法实现,但是调用将以抽象类中定义的方式进行。

模板模式

1.创建一个抽象类 它的模板方法被设置为final

public abstract class Game {
   abstract void initialize();
   abstract void startPlay();
   abstract void endPlay();

   //模板
   public final void play(){

      //初始化游戏
      initialize();

      //开始游戏
      startPlay();

      //结束游戏
      endPlay();
   }
}

2.创建扩展上述类的实体类

public class Cricket extends Game {

   @Override
   void endPlay() {
      System.out.println("Cricket Game Finished!");
   }

   @Override
   void initialize() {
      System.out.println("Cricket Game Initialized! Start playing.");
   }

   @Override
   void startPlay() {
      System.out.println("Cricket Game Started. Enjoy the game!");
   }
}

public class Football extends Game {

   @Override
   void endPlay() {
      System.out.println("Football Game Finished!");
   }

   @Override
   void initialize() {
      System.out.println("Football Game Initialized! Start playing.");
   }

   @Override
   void startPlay() {
      System.out.println("Football Game Started. Enjoy the game!");
   }
}

3.使用 Game 的模板方法 play() 来演示游戏的定义方式

public class TemplatePatternDemo {
   public static void main(String[] args) {

      Game game = new Cricket();
      game.play();
      System.out.println();
      game = new Football();
      game.play();      
   }
}

模板模式 番外

1.创建抽象类

package Pattern_Design_Behavior.template_pattern;

public abstract class Hamburger {
    //默认是有生菜的
    private boolean lettuceHook = true;
    public void setLettuceHook(boolean lettuceHook){
        this.lettuceHook = lettuceHook;
    }

    public final void getHumburger(){
        topBread();
        if (lettuceHook){
            lettuce();
        }
        meat();
        bottomBread();
    }

    protected void topBread(){
        System.out.println("上面的面包");
    }

    protected void lettuce(){
        System.out.println("中间的生菜");
    }

    protected abstract void meat();

    private void bottomBread(){
        System.out.println("底部的面包");
    }
}

2.创建抽象类的实现类

package Pattern_Design_Behavior.template_pattern.impl;

import Pattern_Design_Behavior.template_pattern.Hamburger;

public class CodFishBurger extends Hamburger {
    @Override
    protected void meat() {
        System.out.println("深海鲟鱼");
    }
}

3.测试

package Pattern_Design_Behavior.template_pattern.impl;

import Pattern_Design_Behavior.template_pattern.Hamburger;

public class TemplatePattern {
    public static void main(String[] args) {
        System.out.println("第一个汉堡包");
        Hamburger codFishBurger = new CodFishBurger();
        codFishBurger.getHumburger();

        System.out.println();

        System.out.println("第二个汉堡包");
        Hamburger codFishBurgerTow = new CodFishBurger();
        codFishBurgerTow.setLettuceHook(false);
        codFishBurgerTow.getHumburger();
    }
}

总结

模板方法是一种非常基础的设计模式,在面向对象中有着大量的应用(如Java的HttpServlet)。它用简洁的机制(抽象函数的多态性)实现为很多应用框架提供灵活的扩展点,是程序复用方面的基本实现结构。

除了提供灵活的应用子步骤变化之外,”不要调用我,让我来调用你”的反向控制结构是模板方法的典型应用。(钩子)

本文标题:设计模式 - 模板

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:22:31

原始链接:http://bangjinhu.github.io/undefined/设计模式 - 模板模式 重点/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.